/**
 ******************************************************************************
 *
 * @file       sizelatlng.h
 * @author     The OpenPilot Team, http://www.openpilot.org Copyright (C) 2012.
 * @brief
 * @see        The GNU Public License (GPL) Version 3
 * @defgroup   OPMapWidget
 * @{
 *
 *****************************************************************************/
/*
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
 * for more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc.,
 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 */
#ifndef SIZELATLNG_H
#define SIZELATLNG_H


#include <QString>


namespace internals {
struct PointLatLng;
struct SizeLatLng {
public:
    SizeLatLng();
    static SizeLatLng Empty;

    SizeLatLng(SizeLatLng const &  size)
    {
        this->widthLng  = size.widthLng;
        this->heightLat = size.heightLat;
    }

    SizeLatLng(PointLatLng const &  pt);


    SizeLatLng(double const & heightLat, double const &  widthLng)
    {
        this->heightLat = heightLat;
        this->widthLng  = widthLng;
    }

    friend SizeLatLng operator+(SizeLatLng const &  sz1, SizeLatLng const &  sz2);
    friend SizeLatLng operator-(SizeLatLng const &  sz1, SizeLatLng const &  sz2);
    friend bool operator==(SizeLatLng const &  sz1, SizeLatLng const &  sz2);
    friend bool operator!=(SizeLatLng const &  sz1, SizeLatLng const &  sz2);


// static explicit operator PointLatLng(SizeLatLng size)
// {
// return new PointLatLng(size.HeightLat(), size.WidthLng());
// }


    bool IsEmpty() const
    {
        return (this->widthLng == 0) && (this->heightLat == 0);
    }

    double WidthLng() const
    {
        return this->widthLng;
    }
    void SetWidthLng(double const & value)
    {
        this->widthLng = value;
    }


    double HeightLat() const
    {
        return this->heightLat;
    }
    void SetHeightLat(double const & value)
    {
        this->heightLat = value;
    }

    static SizeLatLng Add(SizeLatLng const & sz1, SizeLatLng const & sz2)
    {
        return SizeLatLng(sz1.HeightLat() + sz2.HeightLat(), sz1.WidthLng() + sz2.WidthLng());
    }

    static SizeLatLng Subtract(SizeLatLng const & sz1, SizeLatLng const & sz2)
    {
        return SizeLatLng(sz1.HeightLat() - sz2.HeightLat(), sz1.WidthLng() - sz2.WidthLng());
    }

// override bool Equals(object obj)
// {
// if(!(obj is SizeLatLng))
// {
// return false;
// }
// SizeLatLng ef = (SizeLatLng) obj;
// return (((ef.WidthLng == this->WidthLng) && (ef.HeightLat == this->HeightLat)) && ef.GetType().Equals(base.GetType()));
// }

// override int GetHashCode()
// {
// return base.GetHashCode();
// }

// PointLatLng ToPointLatLng()
// {
// return (PointLatLng) this;
// }

    QString ToString()
    {
        return "{WidthLng=" + QString::number(this->widthLng) + ", HeightLng=" + QString::number(this->heightLat) + "}";
    }


private:
    double heightLat;
    double widthLng;
};
}
#endif // SIZELATLNG_H
